#ifndef SYMBOLEVALUE_H
#define SYMBOLEVALUE_H

#include <string.h>
#include <iostream>
using namespace std;
#include "Symbole.h"
#include "Arbre.h"
#include "Valeur.h"
#include "NoeudVisitor.h"

class SymboleValue : public Symbole,  // un symbole valué est un symbole qui a une valeur, définie ou pas
            public Noeud  {  // et c'est aussi une feuille de l'arbre abstrait
public:
    SymboleValue(Symbole s, string type, unsigned int ligne=99); // construit un symbole valué à partir d'un symbole existant s, il a un type
    ~SymboleValue( ) {}
    Valeur*  getValeur(); // on renvoie un pointeur sur une valeur suivant le type de la variable
    string  getType() {
        return type;    // getteur
    }
    void setValeur(Valeur* valeur); // setteur
    inline unsigned int getLigne()  {
        return this->ligne;    // accesseur
    }
    inline bool estDefini()  {
        return defini;    // accesseur
    }
    void Accept(NoeudVisitor& visitor); // Pattern visitor

    friend ostream & operator << (ostream & cout, SymboleValue symb); // affiche un symbole value sur cout

private:
    bool defini;	// indique si la valeur du symbole est définie
    Valeur *valeur;	// valeur du symbole si elle est définie, zéro sinon
    unsigned int ligne; // on sauvegarde la ligne pour l'indiquer lors des erreurs.
    string type; // le type de la variable, peut etre egale a ENTIER, REEL, CHAINE, CHAR defini dans motcles.h
};

#endif /* SYMBOLEVALUE_H */
